Skip to content

Land FW-601, FW-602, FW-603 on preview (with billing) - #47

Merged
ashutosh091 merged 7 commits into
previewfrom
integrate/fw-601-602-603
Nov 14, 2026
Merged

ashutosh091 merged 7 commits into
previewfrom
integrate/fw-601-602-603

Conversation

@ashutosh091

Copy link
Copy Markdown
Contributor

Lands #44 (FW-601, header sign-in), #45 (FW-602, profile name) and #43 (FW-603, open sign-up) on preview in that order. Their branches conflicted with the Paygate billing work (#46), and the contributor's fork can't take pushes from here. Each PR's own commits are kept unchanged, so GitHub marks all three as merged when this lands.

Fixes made while merging

  • Migration renumbered: 0003_profile_name.sql → 0004_profile_name.sql. Preview already has 0003_billing.sql; two 0003 files would only apply in the right order by accident.
  • Pricing copy: Open sign-up: new accounts go straight to the console (FW-603) #43's "Paid plans aren't billed yet" is no longer true now that Paygate billing is live, and neither is preview's "by invitation during early access" once sign-up is open.
    • /pricing note: "Start on Free. Upgrade when you need more"
    • The FAQ: sign up now, then move to Team or Business from /pricing or /account.
  • Landing page: keeps the Pricing section, followed by Open sign-up: new accounts go straight to the console (FW-603) #43's Get started section. The header and footer link to both Pricing and Get started (shown as "Sign up" in the header).
  • /account: the Name form (FW-602) sits above the billing card.
  • API: keeps both the /billing/* routes and /auth/profile. <user> in the README documents name alongside the billing docs.
  • Billing tests: the suite pins SIGNUP_MODE: "waitlist". Its "waiting accounts can't buy" case relied on the old deployed default, which Open sign-up: new accounts go straight to the console (FW-603) #43 switches to open.
  • docs/ rebuilt.

Checks

  • npm --prefix api run check: 86/86 pass.
  • npm --prefix site run check: typecheck, 24/24 tests and the build all pass.
  • Dev server in a browser:
    • Header shows Roadmap · Pricing · Sign up · Sign in.
    • Sections end with pricing, then get-started.
    • The footer has Pricing and Get started.
    • /pricing CTAs go to /signup and the new copy shows.
    • No horizontal scroll and no console errors.

After merge, in this order

  1. npm --prefix api run migrate:remote (adds users.name)
  2. npm --prefix api run deploy (open sign-up, /auth/profile)

Deploying the Worker before the migration breaks sign-in, because the new code reads users.name.

dikshant-deskera and others added 7 commits November 13, 2026 17:42
The header on the landing page and /pricing gets an account slot beside
the GitHub button:

- Signed out, it reads Sign in, linking to /login.
- Signed in, it shows the account's initial and address. A menu says
  who is signed in and offers Account, Console and Sign out. An account
  still on the waitlist gets Waitlist instead of Console. Signing out
  stays on the page and puts focus on Sign in; a sign-out that fails
  says so in the menu.
- The landing page is prerendered with no session, so the slot keeps
  one width and shows nothing until the service answers. Someone signed
  in never sees Sign in flash by, and the links never move. If the
  service can't be asked, it offers Sign in.

Below 1100px the slot narrows to the initial and the GitHub button to
its mark, so the links fit as before. Below 851px the menu hangs from
the header's right edge so it stays inside the window.

The "How it works" menu's close-on-outside-press, Escape and tab-out
handling moves into a useDismiss hook that both menus use, and its
panel motion into lib/panel.ts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Accounts kept only an email address, so the header could only show
that. Now an account can have a name:

- api: migration 0003 adds users.name, and the user the service
  describes carries it (null until given). /auth/verify takes an
  optional name, which names a new account or one without a name yet,
  and never replaces one. A new POST /auth/profile sets or clears it
  for the signed-in account. A name is trimmed, its runs of spaces made
  one, and up to 80 characters; control characters and bidirectional
  overrides are refused, before the code is tried, so a bad name
  doesn't use up a try. The admin listing carries names too.
- site: /signup asks for an optional name above the address. /account
  has a Name field to change or clear it. The header shows the name,
  with the initials of its first and last words ("AL"), and the menu
  shows the name above the address; without a name, both show the
  address as before. The console's footer and the admin page show it
  too. The in-browser demo keeps the name with its session.

Tests: api/test/profile.test.mjs covers giving, keeping, changing and
clearing a name, what's refused, the session and origin checks, and
the admin listing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pillOutline sits on shadcn's default Button variant, whose
hover:bg-primary/80 it never overrode, so under the pointer an
outlined button (Sign out on /account, Resend code and Use another
address while signing in, Save name) turned near-black with its dark
text unreadable. It now keeps its fill, and only its border darkens,
as intended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The service's SIGNUP_MODE is now "open", so whoever signs in uses the
console, and accounts that were waiting are let in too. The waitlist
stays in the code: setting it back to "waitlist" brings it back.

The site stops talking about a waitlist and early access:

- The landing page's last section is Get started (#get-started), with
  "Get started free" for /signup. The header links to it as Sign up
  (as short as Waitlist was, so the links still fit one row at phone
  widths), and the footer as Get started.
- /pricing says to start on Free and that paid plans aren't billed yet.
  The Free, Launch and Scale cards say Get started, and the FAQ says
  you can sign up now.
- /signup's lead says the account opens the console again.
- The admin page opens on All while sign-up is open, since nobody
  waits, and Remove's question no longer says the account goes back on
  the waitlist.

The API tests now follow the deployed setting, and the waitlist tests
turn the waitlist on themselves. api/README.md says sign-up is open
and how to put the waitlist back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Renumber the profile-name migration to 0004: preview already has
0003_billing.sql, and two 0003 migrations would apply in name order
by accident. Keep both the billing routes and /auth/profile, and show
the Name form above the billing card on /account.
Keep the landing Pricing section, with Get started after it, and both
Pricing and Get started in the header and footer. Drop #43's "paid plans
aren't billed yet" copy: Paygate billing is live, so /pricing now says
to start on Free and upgrade when needed. The billing suite pins
SIGNUP_MODE to waitlist, since its waiting-account case relied on the
old deployed default. Rebuild docs/.
@ashutosh091
ashutosh091 merged commit 5514786 into preview Nov 14, 2026
3 checks passed
@ashutosh091
ashutosh091 deleted the integrate/fw-601-602-603 branch November 14, 2026 15:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants